package com.chris.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.oauth2.provider.token.TokenStore;
import org.springframework.security.oauth2.provider.token.store.JwtAccessTokenConverter;
import org.springframework.security.oauth2.provider.token.store.JwtTokenStore;

/**
 * 令牌相关配置类
 */
@Configuration
public class AccessTokenConfig {
    //JWT签名的秘钥，这里使用的是对称加密，资源服务中也要使用相同的秘钥进行校验和解析JWT令牌，实际工作中还是需要使用非对称加密
    private final static String SIGN_KEY = "myjszl";

    /**
     * 令牌的存储策略，这里使用的是JwtTokenStore，使用JWT的令牌生成方式，
     * 其实还有以下两个比较常用的方式：
     * RedisTokenStore：将令牌存储到Redis中，此种方式相对于内存方式来说性能更好
     * JdbcTokenStore：将令牌存储到数据库中，需要新建对应的表
     * @return
     */
    @Bean
    TokenStore tokenStore(){
        return new JwtTokenStore(jwtAccessTokenConverter());
    }

    /**
     * 令牌增强类，用于JWT令牌和OAuth身份进行转换
     * TokenEnhancer的子类，在jwt编码的令牌值和OAUTH身份验证信息之间进行转换
     * TODO 后期可以改为非对称加密
     * @return
     */
    @Bean
    public JwtAccessTokenConverter jwtAccessTokenConverter(){
        JwtAccessTokenConverter jwtAccessTokenConverter = new JwtAccessTokenConverter();
        //设置密钥
        jwtAccessTokenConverter.setSigningKey(SIGN_KEY);
        return jwtAccessTokenConverter;
    }
}
